package top.fengleifeng.question;

/**
 * @program: leetcode-test
 * @description: 给定一个整数数组，其中第 i 个元素代表了第 i 天的股票价格 。​
 * <p>
 * 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:
 * <p>
 * 你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
 * 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
 * 示例:
 * <p>
 * 输入: [1,2,3,0,2]
 * 输出: 3
 * 解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
 * 通过次数57,426提交次数100,483
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * @author: fengleifeng
 * @create: 2020-09-15 17:19
 **/
public class Num309最佳买卖股票时机含冷冻期 {
    //第几天   还剩几次交易  状态0持有股票，1每持有不能买，2每持有能买
    class Solution {
        public int maxProfit(int[] prices) {
            if(prices.length<=0){
                return 0;
            }
            int[][] dps = new int[prices.length][3];
            dps[0][0] = -prices[0];
            dps[0][1] = 0;
            dps[0][2] = 0;
            for (int i = 1; i < prices.length; i++) {
                dps[i][0] = Math.max(dps[i - 1][0], dps[i - 1][2] - prices[i]);
                dps[i][1] = dps[i - 1][0] + prices[i];
                dps[i][2] = Math.max(dps[i - 1][1], dps[i - 1][2]);
            }
            return Math.max(dps[prices.length - 1][1], dps[prices.length - 1][2]);
        }
    }

    public static void main(String[] args) {
        int[] ints = {};
        int i = new Num309最佳买卖股票时机含冷冻期().new Solution().maxProfit(ints);
        System.out.println(i);
    }

}
